package com.munichosica.myapp.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import com.munichosica.myapp.dao.ProductoDao;
import com.munichosica.myapp.dto.Producto;
import com.munichosica.myapp.exceptions.ProductoDaoException;

public class ProductoDaoImpl implements ProductoDao{

	private StringBuilder sql=null;
	private StringBuilder sqlSelect=null;
	
	public ProductoDaoImpl() {
		sql=new StringBuilder();
		sqlSelect=new StringBuilder();
		sqlSelect.append("SELECT PROCODIGO_I AS PROCODIGO," +
				"CATCODIGO_I AS CATCODIGO, " +
				"PRONOMBRE_V AS NOMBRE, " +
				"PRODESCRIPCION_V AS DESCRIPCION, " +
				"PROABREV_C AS ABREV, " +
				"PROPRECIOCOMPRA_D AS PRECIOCOMPRA, " +
				"PROPRECIOVENTA_D PRECIOVENTA," +
				"PROSTOCKMINIMO_I STOCKMINIMO," +
				"PROSTOCKMAXIMO_I STOCKMAXIMO," +
				"PROCODBARRA_V BARCODE, " +
				"PROOBSERVACIONES_V AS OBSERVACIONES, " +
				"PROAPLICACIONES_V AS APLICACIONES," +
				"FOTOGRANDE_I FOTOGRANDE," +
				"FOTOPEQUENA_I FOTOPEQUENA, " +
				"PROESTADO_C AS ESTADO " +
				"FROM PRODUCTO ");
	}
	
	@Override
	public List<Producto> listarPorCriterio(String criterio, String texto,
			String estado) throws ProductoDaoException {
		sql.append("SELECT PRO.PROCODIGO_I AS PROCODIGO, " +
				"PRO.CATCODIGO_I AS CATCODIGO, " +
				"CAT.CATNOMBRE_V AS CATEGORIA, " +
				"PRO.PRONOMBRE_V AS NOMBRE, " +
				"PRO.PRODESCRIPCION_V AS DESCRIPCION, " +
				"PRO.PROABREV_C AS ABREV, " +
				"PRO.PROPRECIOCOMPRA_D AS PRECIOCOMPRA, " +
				"PRO.PROPRECIOVENTA_D PRECIOVENTA, " +
				"PRO.PROOBSERVACIONES_V AS OBSERVACIONES, " +
				"PRO.PROAPLICACIONES_V AS APLICACIONES," +
				"PRO.PROCODBARRA_V AS BARCODE, " +
				"PRO.PROESTADO_C AS ESTADO " +
				"FROM PRODUCTO PRO " +
				"INNER JOIN CATEGORIA CAT ON CAT.CATCODIGO_I=PRO.CATCODIGO_I " +
				"WHERE PRO.PROESTADO_C LIKE '%"+estado.trim()+"%' ");
		if(!criterio.isEmpty()) sql.append("AND IFNULL("+criterio.trim()+",'') LIKE '%"+texto.trim()+"%'");
		System.out.println(sql);
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		List<Producto> lista=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			boolean results=stmt.execute();
			if(results){
				lista=new ArrayList<Producto>();
				rs=stmt.getResultSet();
				Producto producto=null;
				while(rs.next()){
					producto=new Producto();
					producto.setProcodigoI(rs.getInt("PROCODIGO"));
					producto.getCategoria().setCatcodigoI(rs.getInt("CATCODIGO"));
					producto.getCategoria().setCatnombreV(rs.getString("CATEGORIA"));
					producto.setPronombreV(rs.getString("NOMBRE"));
					producto.setProdescripcionV(rs.getString("DESCRIPCION"));
					producto.setProabrevC(rs.getString("ABREV"));
					producto.setPropreciocompraD(rs.getFloat("PRECIOCOMPRA"));
					producto.setProprecioventaD(rs.getFloat("PRECIOVENTA"));
					producto.setProobservacionesV(rs.getString("OBSERVACIONES"));
					producto.setProaplicacionesV(rs.getString("APLICACIONES"));
					producto.setProcodbarraV(rs.getString("BARCODE"));
					producto.setProestadoC(rs.getString("ESTADO"));
					lista.add(producto);
				}
			}
		} catch (SQLException e) {
			throw new ProductoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return lista;
	}

	@Override
	public Producto insertar(Producto producto) throws ProductoDaoException {
		sql.append("INSERT INTO PRODUCTO (catcodigo_i, pronombre_v, prodescripcion_v, " +
				"proabrev_c, propreciocompra_d, proprecioventa_d, proobservaciones_v, " +
				"proaplicaciones_v, prousuarioregistra_v, profecharegistra_f, " +
				"prostockminimo_i, prostockmaximo_i,fotogrande_i,fotopequena_i,procodbarra_v,proestado_c) " +
				"VALUES " +
				"(?,?,?,?,?,?,?,?,?,CURDATE(),?,?,?,?,?,?)");
				/*"" +
				"("+producto.getCategoria().getCatcodigoI()+", '"+producto.getPronombreV()+"', '"+producto.getProdescripcionV()
				+"', '"+producto.getProabrevC()+"', "+producto.getPropreciocompraD()+", "+producto.getProprecioventaD()
				+", '"+producto.getProobservacionesV()+"', '"+producto.getProaplicacionesV()+"', 'A', '"
				+producto.getProusuarioregistraV()+"', CURDATE(), "
				+producto.getProstockminimoI()+", "+producto.getProstockmaximoI()+")");*/
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString(),PreparedStatement.RETURN_GENERATED_KEYS);
			stmt.setInt(1, producto.getCategoria().getCatcodigoI());
			stmt.setString(2, producto.getPronombreV());
			stmt.setString(3, producto.getProdescripcionV());
			stmt.setString(4, producto.getProabrevC());
			stmt.setFloat(5, producto.getPropreciocompraD());
			stmt.setFloat(6, producto.getProprecioventaD());
			stmt.setString(7, producto.getProobservacionesV());
			stmt.setString(8, producto.getProaplicacionesV());
			stmt.setString(9, producto.getProusuarioregistraV());
			stmt.setInt(10, producto.getProstockminimoI());
			stmt.setInt(11, producto.getProstockmaximoI());
			if(producto.getFotogrande().getArccodigoI()==null){
				stmt.setNull(12, Types.INTEGER);
			}else{
				stmt.setInt(12, producto.getFotogrande().getArccodigoI());
			}
			if(producto.getFotopequena().getArccodigoI()==null){
				stmt.setNull(13, Types.INTEGER);
			}else{
				stmt.setInt(13, producto.getFotopequena().getArccodigoI());
			}
			stmt.setString(14, producto.getProcodbarraV().trim());
			stmt.setString(15, producto.getProestadoC());
			int results=stmt.executeUpdate();
			if(results>0){
				rs=stmt.getGeneratedKeys();
				if(rs.next()){
					producto.setProcodigoI(rs.getInt(1));
				}
			}
		} catch (SQLException e) {
			throw new ProductoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return producto;
	}

	@Override
	public Producto modificar(Producto producto) throws ProductoDaoException {
		sql.append("UPDATE PRODUCTO SET " +
				"catcodigo_i=?, " +
				"pronombre_v=?, " +
				"prodescripcion_v=?, " +
				"proabrev_c=?, " +
				"propreciocompra_d=?, " +
				"proprecioventa_d=?, " +
				"proobservaciones_v=?, " +
				"proaplicaciones_v=?, " +
				"prousuarioactualiza_v=?, " +
				"profechaactualiza_f=CURDATE(), " +
				"prostockminimo_i=?, " +
				"prostockmaximo_i=?," +
				"fotogrande_i=?," +
				"proestado_c=?," +
				"procodbarra_v=? " +
				"WHERE procodigo_i=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setInt(1, producto.getCategoria().getCatcodigoI());
			stmt.setString(2, producto.getPronombreV());
			stmt.setString(3, producto.getProdescripcionV());
			stmt.setString(4, producto.getProabrevC());
			stmt.setFloat(5, producto.getPropreciocompraD());
			stmt.setFloat(6, producto.getProprecioventaD());
			stmt.setString(7, producto.getProobservacionesV());
			stmt.setString(8, producto.getProaplicacionesV());
			stmt.setString(9, producto.getProusuarioactualizaV());
			stmt.setInt(10, producto.getProstockminimoI());
			stmt.setInt(11, producto.getProstockmaximoI());
			stmt.setInt(12, producto.getFotogrande().getArccodigoI());
			stmt.setString(13, producto.getProestadoC());
			stmt.setString(14, producto.getProcodbarraV());
			stmt.setInt(15, producto.getProcodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new ProductoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return producto;
	}

	@Override
	public Producto obtener(Integer codigo) throws ProductoDaoException {
		sqlSelect.append("WHERE PROCODIGO_I=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		Producto producto=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sqlSelect.toString());
			stmt.setInt(1, codigo);
			boolean results=stmt.execute();
			if(results){
				rs=stmt.getResultSet();
				if(rs.next()){
					producto=new Producto();
					producto.setProcodigoI(rs.getInt("PROCODIGO"));
					producto.getCategoria().setCatcodigoI(rs.getInt("CATCODIGO"));
					producto.setPronombreV(rs.getString("NOMBRE"));
					producto.setProdescripcionV(rs.getString("DESCRIPCION"));
					producto.setProabrevC(rs.getString("ABREV"));
					producto.setPropreciocompraD(rs.getFloat("PRECIOCOMPRA"));
					producto.setProprecioventaD(rs.getFloat("PRECIOVENTA"));
					producto.setProstockminimoI(rs.getInt("STOCKMINIMO"));
					producto.setProstockmaximoI(rs.getInt("STOCKMAXIMO"));
					producto.setProcodbarraV(rs.getString("BARCODE"));
					producto.getFotogrande().setArccodigoI(rs.getInt("FOTOGRANDE"));
					producto.getFotopequena().setArccodigoI(rs.getInt("FOTOPEQUENA"));
					producto.setProobservacionesV(rs.getString("OBSERVACIONES"));
					producto.setProaplicacionesV(rs.getString("APLICACIONES"));
					producto.setProestadoC(rs.getString("ESTADO"));
				}
			}
		} catch (SQLException e) {
			throw new ProductoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return producto;
	}

	@Override
	public void eliminar(Producto producto) throws ProductoDaoException {
		sql.append("UPDATE PRODUCTO " +
				"SET PROESTADO_C='I', " +
				"PROUSUARIOACTUALIZA_V=?, " +
				"PROFECHAACTUALIZA_F=CURDATE() " +
				"WHERE PROCODIGO_I=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, producto.getProusuarioactualizaV());
			stmt.setInt(2, producto.getProcodigoI());
			stmt.executeUpdate();
		} catch (SQLException e) {
			throw new ProductoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
	}

	@Override
	public List<Producto> listarTodos() throws ProductoDaoException {
		sql.append("SELECT PRO.PROCODIGO_I AS PROCODIGO, " +
				"PRO.CATCODIGO_I AS CATCODIGO, " +
				"CAT.CATNOMBRE_V AS CATEGORIA, " +
				"PRO.PRONOMBRE_V AS NOMBRE, " +
				"PRO.PRODESCRIPCION_V AS DESCRIPCION, " +
				"PRO.PROABREV_C AS ABREV, " +
				"PRO.PROPRECIOCOMPRA_D AS PRECIOCOMPRA, " +
				"PRO.PROPRECIOVENTA_D PRECIOVENTA, " +
				"PRO.PROOBSERVACIONES_V AS OBSERVACIONES, " +
				"PRO.PROAPLICACIONES_V AS APLICACIONES," +
				"PRO.PROCODBARRA_V AS BARCODE, " +
				"PRO.PROESTADO_C AS ESTADO " +
				"FROM PRODUCTO PRO " +
				"INNER JOIN CATEGORIA CAT ON CAT.CATCODIGO_I=PRO.CATCODIGO_I " +
				"WHERE PRO.PROESTADO_C != 'I'");
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		List<Producto> lista=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			boolean results=stmt.execute();
			if(results){
				lista=new ArrayList<Producto>();
				rs=stmt.getResultSet();
				Producto producto=null;
				while(rs.next()){
					producto=new Producto();
					producto.setProcodigoI(rs.getInt("PROCODIGO"));
					producto.getCategoria().setCatcodigoI(rs.getInt("CATCODIGO"));
					producto.getCategoria().setCatnombreV(rs.getString("CATEGORIA").trim());
					producto.setPronombreV(rs.getString("NOMBRE").trim());
					producto.setProdescripcionV(rs.getString("DESCRIPCION").trim());
					producto.setProabrevC(rs.getString("ABREV").trim());
					producto.setPropreciocompraD(rs.getFloat("PRECIOCOMPRA"));
					producto.setProprecioventaD(rs.getFloat("PRECIOVENTA"));
					producto.setProobservacionesV(rs.getString("OBSERVACIONES").trim());
					producto.setProaplicacionesV(rs.getString("APLICACIONES"));
					producto.setProcodbarraV(rs.getString("BARCODE").trim());
					producto.setProestadoC(rs.getString("ESTADO"));
					lista.add(producto);
				}
			}
		} catch (SQLException e) {
			throw new ProductoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return lista;
	}

	@Override
	public Producto obtenerSimple(Integer codigo) throws ProductoDaoException {
		sql.append("SELECT PROCODIGO_I AS PROCODIGO," +
				"PRONOMBRE_V AS NOMBRE, " +
				"PRODESCRIPCION_V AS DESCRIPCION, " +
				"PROABREV_C AS ABREV, " +
				"PROPRECIOCOMPRA_D AS PRECIOCOMPRA, " +
				"PROPRECIOVENTA_D PRECIOVENTA," +
				"PROSTOCKMINIMO_I STOCKMINIMO," +
				"PROSTOCKMAXIMO_I STOCKMAXIMO," +
				"PROCODBARRA_V BARCODE, " +
				"PROESTADO_C AS ESTADO " +
				"FROM PRODUCTO " +
				"WHERE PROCODIGO_I=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		Producto producto=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setInt(1,codigo);
			boolean results=stmt.execute();
			if(results){
				rs=stmt.getResultSet();
				while(rs.next()){
					producto=new Producto();
					producto.setProcodigoI(rs.getInt("PROCODIGO"));
					producto.setPronombreV(rs.getString("NOMBRE"));
					producto.setProdescripcionV(rs.getString("DESCRIPCION"));
					producto.setProabrevC(rs.getString("ABREV"));
					producto.setPropreciocompraD(rs.getFloat("PRECIOCOMPRA"));
					producto.setProprecioventaD(rs.getFloat("PRECIOVENTA"));
					producto.setProstockminimoI(rs.getInt("STOCKMINIMO"));
					producto.setProstockmaximoI(rs.getInt("STOCKMAXIMO"));
					producto.setProcodbarraV(rs.getString("BARCODE"));
					producto.setProestadoC(rs.getString("ESTADO"));
				}
			}
		} catch (SQLException e) {
			throw new ProductoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return producto;
	}

	@Override
	public Producto obtenerCodBarra(String codBarra) throws ProductoDaoException {
		sql.append("SELECT PROCODIGO_I AS PROCODIGO," +
				"PRONOMBRE_V AS NOMBRE, " +
				"PRODESCRIPCION_V AS DESCRIPCION, " +
				"PROABREV_C AS ABREV, " +
				"PROPRECIOCOMPRA_D AS PRECIOCOMPRA, " +
				"PROPRECIOVENTA_D PRECIOVENTA," +
				"PROSTOCKMINIMO_I STOCKMINIMO," +
				"PROSTOCKMAXIMO_I STOCKMAXIMO," +
				"PROCODBARRA_V BARCODE, " +
				"PROESTADO_C AS ESTADO " +
				"FROM PRODUCTO " +
				"WHERE PROCODBARRA_V=?");
		Connection conn=null;
		PreparedStatement stmt=null;
		ResultSet rs=null;
		Producto producto=null;
		try {
			conn=ResourceManager.getConnection();
			stmt=conn.prepareStatement(sql.toString());
			stmt.setString(1, codBarra);
			boolean results=stmt.execute();
			if(results){
				rs=stmt.getResultSet();
				while(rs.next()){
					producto=new Producto();
					producto.setProcodigoI(rs.getInt("PROCODIGO"));
					producto.setPronombreV(rs.getString("NOMBRE"));
					producto.setProdescripcionV(rs.getString("DESCRIPCION"));
					producto.setProabrevC(rs.getString("ABREV"));
					producto.setPropreciocompraD(rs.getFloat("PRECIOCOMPRA"));
					producto.setProprecioventaD(rs.getFloat("PRECIOVENTA"));
					producto.setProstockminimoI(rs.getInt("STOCKMINIMO"));
					producto.setProstockmaximoI(rs.getInt("STOCKMAXIMO"));
					producto.setProcodbarraV(rs.getString("BARCODE"));
					producto.setProestadoC(rs.getString("ESTADO"));
				}
			}
		} catch (SQLException e) {
			throw new ProductoDaoException(e.getMessage(),e);
		} finally{
			ResourceManager.close(rs);
			ResourceManager.close(stmt);
			ResourceManager.close(conn);
		}
		return producto;
	}

}
